library(tidyverse)
dataset <- read_table("planes/data/Plane_TRAIN.txt", col_names = FALSE)

colnames(dataset) <- c("category", 1:145)

dataset <- dataset %>% add_column(alpha=1, .after = 1)

dim(dataset)
[1] 105 146
# get a description of the dataset

dataset %>% 
    group_by(category) %>%
    summarise(
        n = n()
    )

plot_dataset <- function(s_dataset) {
p_data <- s_dataset %>%
    rownames_to_column() %>%
    pivot_longer(-c(rowname, category, alpha)) %>%
    mutate(name = as.integer(name), category = as.factor(category))

    library(ggplot2)
    g <- ggplot(p_data %>% group_by(category), aes(x = name, y = value, color = category, group = rowname, alpha=alpha)) +
        geom_line() +
        theme_light() +
        theme(
            panel.border = element_blank(),
            axis.ticks.x = element_blank(),
            axis.ticks.y = element_blank(),
            panel.grid.major.x = element_blank(),
            panel.grid.minor.x = element_blank(),
            axis.title.x = element_text(size = rel(1), margin = margin(t = 20, r = 0, b = 0, l = 0)),
            axis.title.y = element_text(size = rel(1), margin = margin(t = 0, r = 20, b = 0, l = 0)),
        ) +
        labs(
            shape = "",
            alpha = ""
        ) +
        scale_alpha(guide = 'none') +
        xlab("time") +
        ylab("value")

    return(g)
}
plot_dataset(dataset)
ggsave("planes/results/planes.pdf", width = 10, height = 6)

source("methods/methods.R")

plot_outliers <- function(data, outliers) {
    data <- data %>% rownames_to_column() %>%
        mutate(alpha = if_else(rowname %in% outliers, 1, 0.1)) %>%
        mutate(category = if_else(rowname %in% outliers, "outlier", "no outlier")) %>%
        dplyr::select(-rowname)
    
    plot_dataset(data) +
        scale_color_manual(values=c("grey", "steelblue"))    
}

generate_outliers_dataset <- function(data, outliers, method) {
    data <- data %>% rownames_to_column() %>%
        mutate(alpha = if_else(rowname %in% outliers, 1, 0.1)) %>%
        mutate(category = if_else(rowname %in% outliers, "outlier", "no outlier")) %>%
        add_column(method = method) %>%
        dplyr::select(-rowname)
    data
}
data <- as.matrix(dataset[-c(1:2)])
aaknn <- AAKNN(data)
d1 <- generate_outliers_dataset(dataset, aaknn, "FAA + KNN")
plot_outliers(dataset, aaknn)

# ggsave("planes/results/FAAKNN.png")
aaknn <- OTRESH(data)
d2 <- generate_outliers_dataset(dataset, aaknn, "FOADATH")
plot_outliers(dataset, aaknn)

# ggsave("planes/results/FOADATH.png")
aaknn <- OMULTI(data)
d3 <- generate_outliers_dataset(dataset, aaknn, "FOADARMAH")
plot_outliers(dataset, aaknn)

# ggsave("planes/results/FOADARMAH.png")
aaknn <- RMAH(data, t = 1:144)
d4 <- generate_outliers_dataset(dataset, aaknn, "RMAH")
plot_outliers(dataset, aaknn)

# ggsave("planes/results/RMAH.png")
ise <- ISE(data, t = 1:144)
d5 <- generate_outliers_dataset(dataset, ise, "ISFE")
plot_outliers(dataset, ise)

# ggsave("planes/results/ISFE.png")
ogh <- OGH(data, t = 1:144)
d6 <- generate_outliers_dataset(dataset, ogh, "OUG")
plot_outliers(dataset, ise)

# ggsave("planes/results/OUG.png")
pond <- FADALARA(data, 2)
d7 <- generate_outliers_dataset(dataset, pond, "CROFADALARA")
plot_outliers(dataset, pond)

# ggsave("planes/results/CROFADALARA.png")
fom <- FOM(data)
d8 <- generate_outliers_dataset(dataset, fom, "FOM")
plot_outliers(dataset, fom)

# ggsave("planes/results/FOM.png")
fb <- FB(data)
d9 <- generate_outliers_dataset(dataset, fb, "FB")
plot_outliers(dataset, fb)

# ggsave("planes/results/FB.png")
trimknn <- TRIMKMEANS(data, k=7, out_rate=0.05)
d10 <- generate_outliers_dataset(dataset, trimknn, "TRIMKMEANS")
plot_outliers(dataset, trimknn)
# ggsave("planes/results/TRIMKMEANS.png")
trim <- TRIM(data, t = 1:144, out_rate=0.05)
d11 <- generate_outliers_dataset(dataset, trim, "TRIM")
plot_outliers(dataset, trim)

pond <- POND(data, t = 1:144, out_rate = 0.05)
d12 <- generate_outliers_dataset(dataset, pond, "POND")
plot_outliers(dataset, pond)

hdr <- HDR(data, t = 1:144, out_rate = 0.05)
d13 <- generate_outliers_dataset(dataset, hdr, "HDR")
plot_outliers(dataset, hdr)

d <- bind_rows(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13)
p_data <- d %>%
    rownames_to_column() %>%
    pivot_longer(-c(rowname, category, alpha, method)) %>%
    mutate(name = as.integer(name), category = as.factor(category))
g <- ggplot(p_data %>% group_by(category), aes(x = name, y = value, color = category, group = rowname, alpha=alpha)) +
    geom_line() +
    theme_light() +
    theme(
        panel.border = element_blank(),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank(),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        axis.title.x = element_text(size = rel(1), margin = margin(t = 20, r = 0, b = 0, l = 0)),
        axis.title.y = element_text(size = rel(1), margin = margin(t = 0, r = 20, b = 0, l = 0)),
    ) +
    labs(
        shape = "",
        alpha = ""
    ) +
    scale_alpha(guide = 'none') +
    xlab("time") +
    ylab("value") +
    facet_wrap(~method) +
    scale_color_manual(values=c("grey", "steelblue"))    

g


ggsave("planes/results/outliers.pdf", width = 14, height = 8)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCgprbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9IHJwcm9qcm9vdDo6ZmluZF9yc3R1ZGlvX3Jvb3RfZmlsZSgpKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgpgYGB7cn0KZGF0YXNldCA8LSByZWFkX3RhYmxlKCJwbGFuZXMvZGF0YS9QbGFuZV9UUkFJTi50eHQiLCBjb2xfbmFtZXMgPSBGQUxTRSkKCmNvbG5hbWVzKGRhdGFzZXQpIDwtIGMoImNhdGVnb3J5IiwgMToxNDUpCgpkYXRhc2V0IDwtIGRhdGFzZXQgJT4lIGFkZF9jb2x1bW4oYWxwaGE9MSwgLmFmdGVyID0gMSkKCmRpbShkYXRhc2V0KQpgYGAKCmBgYHtyfQojIGdldCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhc2V0CgpkYXRhc2V0ICU+JSAKICAgIGdyb3VwX2J5KGNhdGVnb3J5KSAlPiUKICAgIHN1bW1hcmlzZSgKICAgICAgICBuID0gbigpCiAgICApCmBgYAoKYGBge3J9CgpwbG90X2RhdGFzZXQgPC0gZnVuY3Rpb24oc19kYXRhc2V0KSB7CnBfZGF0YSA8LSBzX2RhdGFzZXQgJT4lCiAgICByb3duYW1lc190b19jb2x1bW4oKSAlPiUKICAgIHBpdm90X2xvbmdlcigtYyhyb3duYW1lLCBjYXRlZ29yeSwgYWxwaGEpKSAlPiUKICAgIG11dGF0ZShuYW1lID0gYXMuaW50ZWdlcihuYW1lKSwgY2F0ZWdvcnkgPSBhcy5mYWN0b3IoY2F0ZWdvcnkpKQoKICAgIGxpYnJhcnkoZ2dwbG90MikKICAgIGcgPC0gZ2dwbG90KHBfZGF0YSAlPiUgZ3JvdXBfYnkoY2F0ZWdvcnkpLCBhZXMoeCA9IG5hbWUsIHkgPSB2YWx1ZSwgY29sb3IgPSBjYXRlZ29yeSwgZ3JvdXAgPSByb3duYW1lLCBhbHBoYT1hbHBoYSkpICsKICAgICAgICBnZW9tX2xpbmUoKSArCiAgICAgICAgdGhlbWVfbGlnaHQoKSArCiAgICAgICAgdGhlbWUoCiAgICAgICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxKSwgbWFyZ2luID0gbWFyZ2luKHQgPSAyMCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLAogICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxKSwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMjAsIGIgPSAwLCBsID0gMCkpLAogICAgICAgICkgKwogICAgICAgIGxhYnMoCiAgICAgICAgICAgIHNoYXBlID0gIiIsCiAgICAgICAgICAgIGFscGhhID0gIiIKICAgICAgICApICsKICAgICAgICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykgKwogICAgICAgIHhsYWIoInRpbWUiKSArCiAgICAgICAgeWxhYigidmFsdWUiKQoKICAgIHJldHVybihnKQp9CmBgYAoKYGBge3J9CnBsb3RfZGF0YXNldChkYXRhc2V0KQpnZ3NhdmUoInBsYW5lcy9yZXN1bHRzL3BsYW5lcy5wZGYiLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA2KQpgYGAKCmBgYHtyfQpgYGAKCmBgYHtyfQpzb3VyY2UoIm1ldGhvZHMvbWV0aG9kcy5SIikKYGBgCgoKYGBge3J9CgpwbG90X291dGxpZXJzIDwtIGZ1bmN0aW9uKGRhdGEsIG91dGxpZXJzKSB7CiAgICBkYXRhIDwtIGRhdGEgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigpICU+JQogICAgICAgIG11dGF0ZShhbHBoYSA9IGlmX2Vsc2Uocm93bmFtZSAlaW4lIG91dGxpZXJzLCAxLCAwLjEpKSAlPiUKICAgICAgICBtdXRhdGUoY2F0ZWdvcnkgPSBpZl9lbHNlKHJvd25hbWUgJWluJSBvdXRsaWVycywgIm91dGxpZXIiLCAibm8gb3V0bGllciIpKSAlPiUKICAgICAgICBkcGx5cjo6c2VsZWN0KC1yb3duYW1lKQogICAgCiAgICBwbG90X2RhdGFzZXQoZGF0YSkgKwogICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiZ3JleSIsICJzdGVlbGJsdWUiKSkgICAgCn0KCmdlbmVyYXRlX291dGxpZXJzX2RhdGFzZXQgPC0gZnVuY3Rpb24oZGF0YSwgb3V0bGllcnMsIG1ldGhvZCkgewogICAgZGF0YSA8LSBkYXRhICU+JSByb3duYW1lc190b19jb2x1bW4oKSAlPiUKICAgICAgICBtdXRhdGUoYWxwaGEgPSBpZl9lbHNlKHJvd25hbWUgJWluJSBvdXRsaWVycywgMSwgMC4xKSkgJT4lCiAgICAgICAgbXV0YXRlKGNhdGVnb3J5ID0gaWZfZWxzZShyb3duYW1lICVpbiUgb3V0bGllcnMsICJvdXRsaWVyIiwgIm5vIG91dGxpZXIiKSkgJT4lCiAgICAgICAgYWRkX2NvbHVtbihtZXRob2QgPSBtZXRob2QpICU+JQogICAgICAgIGRwbHlyOjpzZWxlY3QoLXJvd25hbWUpCiAgICBkYXRhCn0KYGBgCgpgYGB7cn0KZGF0YSA8LSBhcy5tYXRyaXgoZGF0YXNldFstYygxOjIpXSkKYGBgCgpgYGB7cn0KYWFrbm4gPC0gQUFLTk4oZGF0YSkKZDEgPC0gZ2VuZXJhdGVfb3V0bGllcnNfZGF0YXNldChkYXRhc2V0LCBhYWtubiwgIkZBQStrTk4iKQpwbG90X291dGxpZXJzKGRhdGFzZXQsIGFha25uKQojIGdnc2F2ZSgicGxhbmVzL3Jlc3VsdHMvRkFBS05OLnBuZyIpCmBgYAoKYGBge3J9CmFha25uIDwtIE9UUkVTSChkYXRhKQpkMiA8LSBnZW5lcmF0ZV9vdXRsaWVyc19kYXRhc2V0KGRhdGFzZXQsIGFha25uLCAiRk9BREFUSCIpCnBsb3Rfb3V0bGllcnMoZGF0YXNldCwgYWFrbm4pCiMgZ2dzYXZlKCJwbGFuZXMvcmVzdWx0cy9GT0FEQVRILnBuZyIpCmBgYAoKYGBge3J9CmFha25uIDwtIE9NVUxUSShkYXRhKQpkMyA8LSBnZW5lcmF0ZV9vdXRsaWVyc19kYXRhc2V0KGRhdGFzZXQsIGFha25uLCAiRk9BREFSTUFIIikKcGxvdF9vdXRsaWVycyhkYXRhc2V0LCBhYWtubikKIyBnZ3NhdmUoInBsYW5lcy9yZXN1bHRzL0ZPQURBUk1BSC5wbmciKQpgYGAKCgpgYGB7cn0KYWFrbm4gPC0gUk1BSChkYXRhLCB0ID0gMToxNDQpCmQ0IDwtIGdlbmVyYXRlX291dGxpZXJzX2RhdGFzZXQoZGF0YXNldCwgYWFrbm4sICJSTUFIIikKcGxvdF9vdXRsaWVycyhkYXRhc2V0LCBhYWtubikKIyBnZ3NhdmUoInBsYW5lcy9yZXN1bHRzL1JNQUgucG5nIikKYGBgCgoKYGBge3J9CmlzZSA8LSBJU0UoZGF0YSwgdCA9IDE6MTQ0KQpkNSA8LSBnZW5lcmF0ZV9vdXRsaWVyc19kYXRhc2V0KGRhdGFzZXQsIGlzZSwgIklTRkUiKQpwbG90X291dGxpZXJzKGRhdGFzZXQsIGlzZSkKIyBnZ3NhdmUoInBsYW5lcy9yZXN1bHRzL0lTRkUucG5nIikKCmBgYAoKYGBge3J9Cm9naCA8LSBPR0goZGF0YSwgdCA9IDE6MTQ0KQpkNiA8LSBnZW5lcmF0ZV9vdXRsaWVyc19kYXRhc2V0KGRhdGFzZXQsIG9naCwgIk9VRyIpCnBsb3Rfb3V0bGllcnMoZGF0YXNldCwgaXNlKQojIGdnc2F2ZSgicGxhbmVzL3Jlc3VsdHMvT1VHLnBuZyIpCgpgYGAKCgpgYGB7cn0KcG9uZCA8LSBGQURBTEFSQShkYXRhLCAyKQpkNyA8LSBnZW5lcmF0ZV9vdXRsaWVyc19kYXRhc2V0KGRhdGFzZXQsIHBvbmQsICJDUk8tRkFEQUxBUkEiKQpwbG90X291dGxpZXJzKGRhdGFzZXQsIHBvbmQpCiMgZ2dzYXZlKCJwbGFuZXMvcmVzdWx0cy9DUk9GQURBTEFSQS5wbmciKQpgYGAKCgpgYGB7cn0KZm9tIDwtIEZPTShkYXRhKQpkOCA8LSBnZW5lcmF0ZV9vdXRsaWVyc19kYXRhc2V0KGRhdGFzZXQsIGZvbSwgIkZPTSIpCnBsb3Rfb3V0bGllcnMoZGF0YXNldCwgZm9tKQojIGdnc2F2ZSgicGxhbmVzL3Jlc3VsdHMvRk9NLnBuZyIpCgpgYGAKCmBgYHtyfQpmYiA8LSBGQihkYXRhKQpkOSA8LSBnZW5lcmF0ZV9vdXRsaWVyc19kYXRhc2V0KGRhdGFzZXQsIGZiLCAiRkIiKQpwbG90X291dGxpZXJzKGRhdGFzZXQsIGZiKQojIGdnc2F2ZSgicGxhbmVzL3Jlc3VsdHMvRkIucG5nIikKCmBgYAoKYGBge3J9CnRyaW1rbm4gPC0gVFJJTUtNRUFOUyhkYXRhLCBrPTcsIG91dF9yYXRlPTAuMDUpCmQxMCA8LSBnZW5lcmF0ZV9vdXRsaWVyc19kYXRhc2V0KGRhdGFzZXQsIHRyaW1rbm4sICJUUklNS01FQU5TIikKcGxvdF9vdXRsaWVycyhkYXRhc2V0LCB0cmlta25uKQojIGdnc2F2ZSgicGxhbmVzL3Jlc3VsdHMvVFJJTUtNRUFOUy5wbmciKQpgYGAKCmBgYHtyfQp0cmltIDwtIFRSSU0oZGF0YSwgdCA9IDE6MTQ0LCBvdXRfcmF0ZT0wLjA1KQpkMTEgPC0gZ2VuZXJhdGVfb3V0bGllcnNfZGF0YXNldChkYXRhc2V0LCB0cmltLCAiVFJJTSIpCnBsb3Rfb3V0bGllcnMoZGF0YXNldCwgdHJpbSkKYGBgCmBgYHtyfQpwb25kIDwtIFBPTkQoZGF0YSwgdCA9IDE6MTQ0LCBvdXRfcmF0ZSA9IDAuMDUpCmQxMiA8LSBnZW5lcmF0ZV9vdXRsaWVyc19kYXRhc2V0KGRhdGFzZXQsIHBvbmQsICJQT05EIikKcGxvdF9vdXRsaWVycyhkYXRhc2V0LCBwb25kKQpgYGAKCmBgYHtyfQpoZHIgPC0gSERSKGRhdGEsIHQgPSAxOjE0NCwgb3V0X3JhdGUgPSAwLjA1KQpkMTMgPC0gZ2VuZXJhdGVfb3V0bGllcnNfZGF0YXNldChkYXRhc2V0LCBoZHIsICJIRFIiKQpwbG90X291dGxpZXJzKGRhdGFzZXQsIGhkcikKYGBgCgoKYGBge3J9CmQgPC0gYmluZF9yb3dzKGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCwgZDExLCBkMTIsIGQxMykKYGBgCgpgYGB7cn0KcF9kYXRhIDwtIGQgJT4lCiAgICByb3duYW1lc190b19jb2x1bW4oKSAlPiUKICAgIHBpdm90X2xvbmdlcigtYyhyb3duYW1lLCBjYXRlZ29yeSwgYWxwaGEsIG1ldGhvZCkpICU+JQogICAgbXV0YXRlKG5hbWUgPSBhcy5pbnRlZ2VyKG5hbWUpLCBjYXRlZ29yeSA9IGFzLmZhY3RvcihjYXRlZ29yeSkpCmBgYAoKCmBgYHtyfQpnIDwtIGdncGxvdChwX2RhdGEgJT4lIGdyb3VwX2J5KGNhdGVnb3J5KSwgYWVzKHggPSBuYW1lLCB5ID0gdmFsdWUsIGNvbG9yID0gY2F0ZWdvcnksIGdyb3VwID0gcm93bmFtZSwgYWxwaGE9YWxwaGEpKSArCiAgICBnZW9tX2xpbmUoKSArCiAgICB0aGVtZV9saWdodCgpICsKICAgIHRoZW1lKAogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMSksIG1hcmdpbiA9IG1hcmdpbih0ID0gMjAsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxKSwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMjAsIGIgPSAwLCBsID0gMCkpLAogICAgKSArCiAgICBsYWJzKAogICAgICAgIHNoYXBlID0gIiIsCiAgICAgICAgYWxwaGEgPSAiIgogICAgKSArCiAgICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykgKwogICAgeGxhYigidGltZSIpICsKICAgIHlsYWIoInZhbHVlIikgKwogICAgZmFjZXRfd3JhcCh+bWV0aG9kKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImdyZXkiLCAic3RlZWxibHVlIikpICAgIAoKZwoKCmdnc2F2ZSgicGxhbmVzL3Jlc3VsdHMvb3V0bGllcnMucGRmIiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gOCkKYGBgCgoKCgo=